/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.architexa.org.eclipse.gef.handles;

import com.architexa.org.eclipse.draw2d.IFigure;
import com.architexa.org.eclipse.draw2d.Locator;
import com.architexa.org.eclipse.draw2d.geometry.Insets;
import com.architexa.org.eclipse.draw2d.geometry.PrecisionRectangle;
import com.architexa.org.eclipse.draw2d.geometry.Rectangle;

/**
 * A Locator used to place {@link MoveHandle}s.  By default, a
 * MoveHandle's bounds are equal to its owner figure's bounds,
 * expanded by the handle's {@link Insets}.
 */
public class MoveHandleLocator
	implements Locator
{

private IFigure reference;

/**
 * Creates a new MoveHandleLocator and sets its reference
 * figure to <code>ref</code>.  The reference figure should 
 * be the handle's owner figure.
 * @param ref the handle's owner
 */
public MoveHandleLocator(IFigure ref) {
	setReference(ref);
}

/**
 * Returns the reference figure for this locator.
 * @return the handle's owner
 */
protected IFigure getReference() {
	return reference;
}

/**
 * Sets the handle's bounds to that of its owner figure's
 * bounds, expanded by the handle's Insets.
 * @param target The IFigure to relocate
 */
public void relocate(IFigure target) {
	Insets insets = target.getInsets();
	Rectangle bounds;
	if (getReference() instanceof HandleBounds)
		bounds = ((HandleBounds)getReference()).getHandleBounds();
	else
		bounds = getReference().getBounds();
	bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
	getReference().translateToAbsolute(bounds);
	target.translateToRelative(bounds);
	bounds.translate(-insets.left, -insets.top);
	bounds.resize(insets.getWidth() + 1, insets.getHeight() + 1);
	target.setBounds(bounds);
}

/**
 * Sets the reference figure.
 * @param follow the reference figure, should be the handle's owner figure
 */
public void setReference(IFigure follow) {
	this.reference = follow;
}

}


